﻿using System;
using System.Collections.Generic;
using System.Text;
using Business.Entities;
using System.Data;
using System.Data.SqlClient;

namespace Data.Database
{
    public class PersonaAdapter:Adapter
    {
        int tipopers;
        int id;
        string stringi;
        DateTime dt;
        public List<Persona> GetAllAlumnos()
        {

            List<Persona> personas = new List<Persona>();
            try
            {
                this.OpenConnection();
                SqlCommand cmdpersonas = new SqlCommand("select * from personas where tipo_persona=0", SqlConn);
                SqlDataReader drpersonas = cmdpersonas.ExecuteReader();


                while (drpersonas.Read())
                {
                    Persona per = new Persona();
                    per.ID = (int)drpersonas["id_Persona"];
                    id = (int)drpersonas["id_Persona"];

                    per.Nombre = (string)drpersonas["nombre"];
                    stringi = (string)drpersonas["nombre"];

                    per.Apellido = (string)drpersonas["apellido"];
                    stringi = (string)drpersonas["nombre"];

                    per.Direccion = (string)drpersonas["direccion"];
                    stringi = (string)drpersonas["nombre"];

                    per.Email = (string)drpersonas["email"];
                    stringi = (string)drpersonas["nombre"];

                    per.Telefono = (string)drpersonas["telefono"];
                    stringi = (string)drpersonas["nombre"];

                    per.Legajo = (int)drpersonas["legajo"];
                    id = (int)drpersonas["id_Persona"];

                    per.Idplan = (int)drpersonas["id_plan"];
                    id = (int)drpersonas["id_Persona"];

                   tipopers = (int)drpersonas["tipo_persona"];
                    //per.Tipopersona.Tipo=this.tipopersona(tipopers);
                    
                    per.Fechanacimiento = (DateTime)drpersonas["fecha_nac"];
                    dt = (DateTime)drpersonas["fecha_nac"];
                    personas.Add(per);

                }
                drpersonas.Close();
            }
            catch (Exception Ex)
            {
                Exception ExcepcionManejada =
                new Exception("Error al recuperar lista de personas", Ex);
                throw ExcepcionManejada;
            }
            finally
            {
                this.CloseConnection();
            }

            return personas;
        }

        public List<Persona> GetAllProfesores()
        {

            List<Persona> personas = new List<Persona>();
            try
            {
                this.OpenConnection();
                SqlCommand cmdpersonas = new SqlCommand("select * from personas where tipo_persona=1", SqlConn);
                SqlDataReader drpersonas = cmdpersonas.ExecuteReader();


                while (drpersonas.Read())
                {
                    Persona per = new Persona();
                    per.ID = (int)drpersonas["id_Persona"];
                    id = (int)drpersonas["id_Persona"];

                    per.Nombre = (string)drpersonas["nombre"];
                    stringi = (string)drpersonas["nombre"];

                    per.Apellido = (string)drpersonas["apellido"];
                    stringi = (string)drpersonas["nombre"];

                    per.Direccion = (string)drpersonas["direccion"];
                    stringi = (string)drpersonas["nombre"];

                    per.Email = (string)drpersonas["email"];
                    stringi = (string)drpersonas["nombre"];

                    per.Telefono = (string)drpersonas["telefono"];
                    stringi = (string)drpersonas["nombre"];

                    per.Legajo = (int)drpersonas["legajo"];
                    id = (int)drpersonas["id_Persona"];

                    per.Idplan = (int)drpersonas["id_plan"];
                    id = (int)drpersonas["id_Persona"];

                    tipopers = (int)drpersonas["tipo_persona"];
                    //per.Tipopersona.Tipo=this.tipopersona(tipopers);

                    per.Fechanacimiento = (DateTime)drpersonas["fecha_nac"];
                    dt = (DateTime)drpersonas["fecha_nac"];
                    personas.Add(per);

                }
                drpersonas.Close();
            }
            catch (Exception Ex)
            {
                Exception ExcepcionManejada =
                new Exception("Error al recuperar lista de Profesores", Ex);
                throw ExcepcionManejada;
            }
            finally
            {
                this.CloseConnection();
            }

            return personas;
        }






        public Business.Entities.Persona GetOne(int ID)
        {
            Persona per = new Persona();

            try
            {
                this.OpenConnection();
                SqlCommand cmdpersonas = new SqlCommand("select  * from personas where id_Persona = @id", SqlConn);
                cmdpersonas.Parameters.Add("@id", SqlDbType.Int).Value = ID;
                SqlDataReader drpersonas = cmdpersonas.ExecuteReader();
                if (drpersonas.Read())
                {

                    per.ID = (int)drpersonas["id_Persona"];
                    per.Nombre = (string)drpersonas["nombre"];
                    per.Apellido = (string)drpersonas["apellido"];
                    per.Direccion = (string)drpersonas["direccion"];
                    per.Email = (string)drpersonas["email"];
                    per.Telefono = (string)drpersonas["telefono"];
                    per.Legajo = (int)drpersonas["legajo"];
                    per.Idplan = (int)drpersonas["id_plan"];
                    tipopers = (int)drpersonas["tipo_persona"];
                    per.Fechanacimiento = (DateTime)drpersonas["fecha_nac"];
                    //per.Tipopersona.Tipo = this.tipopersona(tipopers);
                    

                }
                drpersonas.Close();
            }
            catch (Exception Ex)
            {
                Exception ExcepcionManejada =
                new Exception("Error al recuperar datos de la Persona", Ex);
                throw ExcepcionManejada;
            }
            finally
            {
                this.CloseConnection();
            }

            return per;
        }






        public void Delete(int ID)
        {

            try
            {
                this.OpenConnection();
                SqlCommand cmdDelete = new SqlCommand("delete from personas where id_Persona=@id", SqlConn);
                cmdDelete.Parameters.Add("@id", SqlDbType.Int).Value = ID;
                cmdDelete.ExecuteNonQuery();
            }

            catch (Exception Ex)
            {
                Exception ExcepcionManejada = new Exception("Error al eliminar Persona", Ex);
                throw ExcepcionManejada;

            }

            finally
            {
                this.CloseConnection();
            }


        }


        protected void Update(Persona Persona)
        {
            Persona pe = new Persona();
            pe = Persona;
            int tipop;
            try
            {
                this.OpenConnection();
                tipop=this.dameInttipoper(pe);
                SqlCommand cmdSave = new SqlCommand(
                "UPDATE personas set nombre=@nombre, apellido=@apellido," +
                "direccion=@direccion, email=@email, telefono=@telefono, fecha_nac=@fecha_nac, legajo=@legajo, tipo_persona=@tipo_persona, id_plan=@idplan " +
                "WHERE id_Persona=@id", SqlConn);
                cmdSave.Parameters.Add("@id", SqlDbType.Int).Value = Persona.ID;
                cmdSave.Parameters.Add("@nombre", SqlDbType.VarChar, 50).Value = Persona.Nombre;
                cmdSave.Parameters.Add("@apellido", SqlDbType.VarChar, 50).Value = Persona.Apellido;
                cmdSave.Parameters.Add("@direccion", SqlDbType.VarChar, 50).Value = Persona.Direccion;
                cmdSave.Parameters.Add("@email", SqlDbType.VarChar, 50).Value = Persona.Email;
                cmdSave.Parameters.Add("@telefono", SqlDbType.VarChar, 50).Value = Persona.Telefono;
                cmdSave.Parameters.Add("@fecha_nac", SqlDbType.DateTime,1).Value = Persona.Fechanacimiento;
                cmdSave.Parameters.Add("@legajo", SqlDbType.VarChar, 50).Value = Persona.Legajo;
                cmdSave.Parameters.Add("@tipo_persona", SqlDbType.Int).Value = tipop;
                cmdSave.Parameters.Add("@idplan", SqlDbType.Int).Value = Persona.Idplan;
                 
                cmdSave.ExecuteNonQuery();
            }

            catch (Exception Ex)
            {
                Exception ExcepcionManejada = new Exception("Error al modificar datos de la Persona", Ex);
                throw ExcepcionManejada;
            }
            finally
            {
                this.CloseConnection();
            }

        }


        protected void Insert(Persona Persona)
        {
            Persona pe = new Persona();
            pe = Persona;
            int tipop;
            try
            {
                this.OpenConnection();
                tipop = this.dameInttipoper(pe);
                SqlCommand cmdSave = new SqlCommand(
                "insert into personas(nombre, apellido, direccion, email, telefono, fecha_nac, legajo, tipo_persona, id_plan) " +
                "values(@nombre, @apellido, @direccion, @email, @telefono, @fecha_nac, @legajo, @tipo_persona, @id_plan) " +
                "select @@identity", SqlConn);
                cmdSave.Parameters.Add("@nombre", SqlDbType.VarChar, 50).Value = Persona.Nombre;
                cmdSave.Parameters.Add("@apellido", SqlDbType.VarChar, 50).Value = Persona.Apellido;
                cmdSave.Parameters.Add("@direccion", SqlDbType.VarChar, 50).Value = Persona.Direccion;
                cmdSave.Parameters.Add("@email", SqlDbType.VarChar, 50).Value = Persona.Email;
                cmdSave.Parameters.Add("@telefono", SqlDbType.VarChar, 50).Value = Persona.Telefono;
                cmdSave.Parameters.Add("@fecha_nac", SqlDbType.DateTime, 1).Value = Persona.Fechanacimiento;
                cmdSave.Parameters.Add("@legajo", SqlDbType.VarChar, 50).Value = Persona.Legajo;
                cmdSave.Parameters.Add("@tipo_persona", SqlDbType.Int).Value = tipop;
                cmdSave.Parameters.Add("@id_plan", SqlDbType.Int).Value = Persona.Idplan;
                Persona.ID = Decimal.ToInt32((decimal)cmdSave.ExecuteScalar());
            }

            catch (Exception Ex)
            {
                Exception ExcepcionManejada = new Exception("Error al crear una Persona", Ex);
                throw ExcepcionManejada;
            }
            finally
            {
                this.CloseConnection();
            }

        }





        public void Save(Persona Persona)
        {
            if (Persona.State == BussinessEntity.States.Deleted)
            {
                this.Delete(Persona.ID);
            }
            else if (Persona.State == BussinessEntity.States.New)
            {
                this.Insert(Persona);
            }
            else if (Persona.State == BussinessEntity.States.Modified)
            {
                this.Update(Persona);
            }
            Persona.State = BussinessEntity.States.Unmodified;

        }
        private TiposPersonas.TipoPer tipopersona(int tipopers)
        {
            if (tipopers == 0)
            {
               return TiposPersonas.TipoPer.Alumno;
            }
            else
            {
                return TiposPersonas.TipoPer.Profesor;
            }
        }
        private int dameInttipoper(Persona p)
        {
            if (p.Tipopersona.Tipo == TiposPersonas.TipoPer.Alumno)
            {
                return 0;
            }
            else
            {
                return 1;
            }
        
        }
    }
}
